AWS IoT SiteWise で時系列データの線形補間を試してみた
先日、AWS IoT SiteWise の線形補間 API を試す機会がありました。
線形補間というシンプルなデータ補間なのでイメージしやすいかと思いますが、この API で何ができて、どのようなデータを取得できるのか、といった点を確認してみました。
なお、線形補間 のサポートは下記リリースにて発表されたものになります。
単純な2点間の線形補間
まずは単純に 2つのデータだけの場合を試してみます。
事前に下記のように2つの時間でSiteWise 上にデータを Put しておきます。
(下記は SiteWise Monitor のグラフを切り抜いたものになります)
- 07 時 02 分:20.47773220685643
- 07 時 08 分:50.47773220685643
AWS CLI の get-interpolated-asset-property-values
コマンドで線形補間してみます。
補完したい時間の最初(--start-time-in-seconds
)と最後(--end-time-in-seconds
)で「 07 時 02 分 〜 07 時 08 分」を指定しています。
また、--interval-in-seconds
で補間したい間隔を 60 秒にしています。
$ aws iotsitewise get-interpolated-asset-property-values \ --property-alias "/test/device/1/temperature" \ --start-time-in-seconds 1652436130 \ --start-time-offset-in-nanos 0 \ --end-time-in-seconds 1652436499 \ --end-time-offset-in-nanos 0 \ --quality GOOD \ --interval-in-seconds 60 \ --type LINEAR_INTERPOLATION
コマンドを実行すると下記のようなレスポンスが得られます。
value
にて60秒間隔で補間されたデータを取得できています。
{ "interpolatedAssetPropertyValues": [ { "timestamp": { "timeInSeconds": 1652436130, "offsetInNanos": 0 }, "value": {} }, { "timestamp": { "timeInSeconds": 1652436190, "offsetInNanos": 0 }, "value": { "doubleValue": 25.35183035271009 } }, { "timestamp": { "timeInSeconds": 1652436250, "offsetInNanos": 0 }, "value": { "doubleValue": 30.229879133197894 } }, { "timestamp": { "timeInSeconds": 1652436310, "offsetInNanos": 0 }, "value": { "doubleValue": 35.1079279136857 } }, { "timestamp": { "timeInSeconds": 1652436370, "offsetInNanos": 0 }, "value": { "doubleValue": 39.9859766941735 } }, { "timestamp": { "timeInSeconds": 1652436430, "offsetInNanos": 0 }, "value": { "doubleValue": 44.864025474661304 } }, { "timestamp": { "timeInSeconds": 1652436490, "offsetInNanos": 0 }, "value": { "doubleValue": 49.74207425514911 } } ] }
このデータを Google スプレッドシートでグラフ化したものが下記になります。
60秒間隔の補完データを取得できました。
データ値が上下している区間の線形補間
次に、下記のような複雑なデータの場合を考えてみます。
グラフの通り、02 時 15 分 〜 02 時 30 分の間でグラフが上下しています。この最初と最後の時間で補間してみます。
時間だけ変えて先ほどと同じコマンドを実行します。
aws iotsitewise get-interpolated-asset-property-values \ --property-alias "/test/device/1/temperature" \ --start-time-in-seconds 1652462100 \ --start-time-offset-in-nanos 0 \ --end-time-in-seconds 1652463060 \ --end-time-offset-in-nanos 0 \ --quality GOOD \ --interval-in-seconds 60 \ --type LINEAR_INTERPOLATION
結果も先程と同じように取得できました。
{ "interpolatedAssetPropertyValues": [ { "timestamp": { "timeInSeconds": 1652462100, "offsetInNanos": 0 }, "value": {} }, { "timestamp": { "timeInSeconds": 1652462160, "offsetInNanos": 0 }, "value": { "doubleValue": 26.47287292625643 } }, { "timestamp": { "timeInSeconds": 1652462220, "offsetInNanos": 0 }, "value": { "doubleValue": 32.47287292625643 } }, 以下略
取得できたデータを先ほどと同じようにグラフ化してみました。データ値が上下していても正しく補間データを取得できています。
ダウンサンプリング
最後に補間間隔を元のデータよりも大きく取ったダウンサンプリングを試してみます。
事前に下記にようなデータを用意しておきます。
(「09 時 30 分〜10 時 30 分」の間で 1 分間隔にデータを Put しています。)
今回は -interval-in-seconds 300
として、補完する時間の間隔を 5分 にしています。
aws iotsitewise get-interpolated-asset-property-values \ --property-alias "/test/device/1/temperature" \ --start-time-in-seconds 1652661000 \ --start-time-offset-in-nanos 0 \ --end-time-in-seconds 1652664000 \ --end-time-offset-in-nanos 0 \ --quality GOOD \ --interval-in-seconds 300 \ --type LINEAR_INTERPOLATION
得られたデータを可視化したものが下記になります。
元のグラフに比べて5分間隔でデータを取得できていることが分かりました。
最後に
以上で基本的な動作を確認できました。
この API は補完データの取得までなので、保管データをそのまま SiteWise に書き込むことはできません。
欠損値を埋めたいような場合は、取得したデータを再度 Put するようなオペレーションを行うことになります。
他のユースケースとしては、外部のデータのサンプリング間隔に合わせたデータを取得したいときなどに役立ちそうです。機会があれば使っていこうと思います。
以上です。